home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / procssng / alv.sun / alv.lha / src / matrix.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-11-08  |  3.3 KB  |  254 lines

  1. tatic char     SccsID[] = "@(#)matrix.c    1.2    11/7/88";
  2.  
  3. #include "matrix.h"
  4.  
  5. ATRIX 
  6. mult(A, B, C)
  7.     MATRIX          A, B, C;
  8. {
  9.     int             i, j, k;
  10.  
  11.     MATRIX          D;
  12.  
  13.     D = mnil();
  14.  
  15.     for (i = 0; i < 4; i++)
  16.         for (j = 0; j < 4; j++) {
  17.             D[i][j] = 0.;
  18.             for (k = 0; k < 4; k++)
  19.                 D[i][j] += A[i][k] * B[k][j];
  20.         }
  21.     mass(D, C);
  22.     mfree(D);
  23.  
  24.     return C;
  25. }
  26.  
  27. ECTOR 
  28. mult(a, B, c)
  29.     VECTOR          a, c;
  30.     MATRIX          B;
  31. {
  32.     int             i, k;
  33.     VECTOR            d;
  34.     double             s;
  35.  
  36.     d = vnil();
  37.     for (i = 0; i < 4; i++) {
  38.         s = 0.;
  39.         for (k = 0; k < 4; k++)
  40.             s += a[k] * B[k][i];
  41.         d[i] = s;
  42.     }
  43.     vass(d,c);
  44.     vfree(d);
  45.     return c;
  46. }
  47.  
  48. ECTOR 
  49. add(a, b, c)
  50.     VECTOR          a, b, c;
  51. {
  52.     int             i;
  53.  
  54.     for (i = 0; i < 3; i++)
  55.         c[i] = a[i] + b[i];
  56.     return c;
  57. }
  58.  
  59. ECTOR 
  60. sub(a, b, c)
  61.     VECTOR          a, b, c;
  62. {
  63.     int             i;
  64.  
  65.     for (i = 0; i < 3; i++)
  66.         c[i] = a[i] - b[i];
  67.     return c;
  68. }
  69.  
  70. bgmprint(A)
  71.     MATRIX          A;
  72. {
  73.     int             i, j;
  74.  
  75.     for (j = 0; j < 4; j++) {
  76.         for (i = 0; i < 4; i++)
  77.             fprintf(stderr,"%15g", A[j][i]);
  78.         fprintf(stderr,"\n");
  79.     }
  80. }
  81.  
  82. print(A)
  83.     MATRIX          A;
  84. {
  85.     int             i, j;
  86.  
  87.     for (j = 0; j < 4; j++) {
  88.         for (i = 0; i < 4; i++)
  89.             printf("%15g", A[j][i]);
  90.         printf("\n");
  91.     }
  92. }
  93.  
  94. bgvprint(V)
  95.     VECTOR          V;
  96. {
  97.     int             i, j;
  98.  
  99.     fprintf(stderr,"(");
  100.     for (i = 0; i < 3; i++)
  101.         fprintf(stderr,"%g,", V[i]);
  102.     fprintf(stderr,"%g)\n", V[3]);
  103. }
  104.  
  105. print(V)
  106.     VECTOR          V;
  107. {
  108.     int             i, j;
  109.  
  110.     printf("(");
  111.     for (i = 0; i < 3; i++)
  112.         printf("%g,", V[i]);
  113.     printf("%g)\n", V[3]);
  114. }
  115.  
  116. ECTOR 
  117. ass(w, v)
  118. ECTOR v,w;
  119. {
  120.     int             i;
  121.  
  122.     for (i = 0; i < 4; i++)
  123.         v[i] = w[i];
  124.     return v;
  125. }
  126.  
  127. ATRIX 
  128. ass(A, B)
  129.     MATRIX          A, B;
  130. {
  131.     int             i;
  132.  
  133.     for (i = 0; i < 16; i++)
  134.         B[0][i] = A[0][i];
  135.     return B;
  136. }
  137.  
  138. ATRIX 
  139. init(p)
  140.     double          p;
  141. {
  142.     double         *q, *r;
  143.     int             i;
  144.     MATRIX          A;
  145.  
  146.     A = (MATRIX) dynamem(&A, sizeof(double), 2, 4, 4);
  147.     r= *A;
  148.     for (q = &p, i = 0; i < 16; i++)
  149.         *r++ = *q++;
  150.     return A;
  151. }
  152.  
  153. ATRIX
  154. set(A, p)
  155.     MATRIX        A;
  156.     double        p;
  157. {
  158.     double        *q, *r;
  159.     int        i;
  160.  
  161.     r= *A;
  162.         for (q = &p, i = 0; i < 16; i++)
  163.                 *r++ = *q++;
  164.         return A;
  165. }
  166.  
  167. ATRIX 
  168. nil()
  169. {
  170.     int             i;
  171.     MATRIX          A;
  172.     double            *q;
  173.  
  174.     A = (MATRIX) dynamem(&A, sizeof(double), 2, 4, 4);
  175.     q = *A;
  176.     for (i = 0; i < 16; i++)
  177.         *q++ = 0.0;
  178.     return A;
  179. }
  180.  
  181. ECTOR 
  182. init(p)
  183.     double          p;
  184. {
  185.     double         *q;
  186.     int             i;
  187.     VECTOR          V;
  188.  
  189.     V = (VECTOR) dynamem(&V, sizeof(double), 1, 4);
  190.     for (q = &p, i = 0; i < 4; i++)
  191.         V[i] = *q++;
  192.     return V;
  193. }
  194.  
  195. ECTOR
  196. set(V, p)
  197.     VECTOR        V;
  198.     double        p;
  199. {
  200.         double         *q;
  201.         int             i;
  202.  
  203.         for (q = &p, i = 0; i < 4; i++)
  204.                 V[i] = *q++;
  205.         return V;
  206. }
  207.  
  208. ECTOR 
  209. nil()
  210. {
  211.     int             i;
  212.     VECTOR          V;
  213.  
  214.     V = (VECTOR) dynamem(&V, sizeof(double), 1, 4);
  215.     for (i = 0; i < 4; i++)
  216.         V[i] = 0.0;
  217.     return V;
  218. }
  219.  
  220. ouble 
  221. prod(v, w)
  222.     VECTOR          v, w;
  223. {
  224.     return v[0] * w[0] + v[1] * w[1] + v[2] * w[2];
  225. }
  226.  
  227. ECTOR 
  228. prod(v, w, y)
  229.     VECTOR          v, w, y;
  230. {
  231.     double          x;
  232.  
  233.     y[0] = v[1] * w[2] - v[2] * w[1];
  234.     y[1] = v[2] * w[0] - v[0] * w[2];
  235.     y[2] = v[0] * w[1] - v[1] * w[0];
  236.     y[3] = 1;
  237.     return y;
  238. }
  239.  
  240. ECTOR 
  241. norm(v, w)
  242.     VECTOR          v, w;
  243. {
  244.     double          length;
  245.     int             i;
  246.  
  247.     length = sqrt(dprod(v, v));
  248.     for (i = 0; i < 3; i++)
  249.         w[i] = v[i] / length;
  250.     w[3] = 1.;
  251.  
  252.     return w;
  253. }
  254.